package com.me.visitor;

import java.util.LinkedList;
import java.util.List;

/**
 * 数据结构，管理很多人（Man , Woman）
 */
public class ObjectStructure {

    /**
     * ArrayList和LinkedList的相同点和不同点
     * <person>
     * 共同点：都是单列集合中List接口的实现类。存取有序，有索引，可重复
     * 不同点：
     * 1.底层实现不同：
     * ArrayList底层实现是数组，LinkedList底层是双向链表，有头尾指针。
     * <person>
     * 2.ArrayList查询快，增删慢。
     * 查询快：数组随机访问，通过数组地址和元素索引计算出元素地址，进行访问。
     * 增删慢：增删不在尾部，都需要移动元素，如果数组容量不足，还需要扩容。（扩容非常影响效率）
     * 扩容：
     * 1.分配一个原数组1.5倍大小的新数组
     * 2.将原数组的内容拷贝到新数组
     * <person>
     * 3.LinkedList查询慢，增删快
     * 查询慢：从头或尾依次寻址。
     * 增删快：只需要修改几个指针的指向。
     * <person>
     * 应用场景：
     * 业务中增删频繁，就用LinkedList
     * 业务中主要是查询，就用ArrayList
     * <person>
     * LinkedList索引查询的时候，是从头开始往后找，还是从尾开始往前找？
     * 答：会先做一个判断，判断要查找的元素距离头部近还是尾部近，距离哪个近就从哪边找
     */
    private List<Person> persons = new LinkedList<>();

    /**
     * 增加到list
     *
     * @param person
     */
    public void attach(Person person) {
        persons.add(person);
    }

    /**
     * 移除
     *
     * @param person
     */
    public void detach(Person person) {
        persons.remove(person);
    }

    /**
     * 显示测评情况
     *
     * @param action
     */
    public void display(Action action) {
        for (Person person : persons) {
            person.accept(action);
        }
    }
}
